/**
 * 五行个数统计工具类
 * 用于计算八字中的五行个数和含藏干数
 */

/**
 * 五行顺序：木、火、土、金、水
 */
const WUXING_ORDER = ['木', '火', '土', '金', '水'];

/**
 * 十神关系映射（以日干为基准）
 */
const TEN_GOD_MAP: { [key: string]: { [key: string]: string } } = {
  '木': { '木': '比劫', '火': '食伤', '土': '财才', '金': '官杀', '水': '印绶' },
  '火': { '木': '印绶', '火': '比劫', '土': '食伤', '金': '财才', '水': '官杀' },
  '土': { '木': '官杀', '火': '印绶', '土': '比劫', '金': '食伤', '水': '财才' },
  '金': { '木': '财才', '火': '官杀', '土': '印绶', '金': '比劫', '水': '食伤' },
  '水': { '木': '食伤', '火': '财才', '土': '官杀', '金': '印绶', '水': '比劫' }
};

/**
 * 统一的五行映射表（天干+地支）
 */
const WUXING_MAP: { [key: string]: string } = {
  // 天干
  '甲': '木', '乙': '木', '丙': '火', '丁': '火', '戊': '土', '己': '土',
  '庚': '金', '辛': '金', '壬': '水', '癸': '水',
  // 地支
  '子': '水', '亥': '水', '寅': '木', '卯': '木', '巳': '火', '午': '火',
  '申': '金', '酉': '金', '辰': '土', '戌': '土', '丑': '土', '未': '土'
};

/**
 * 获取天干或地支的五行
 */
function wxForBz(item: string): string {
  return WUXING_MAP[item] || '';
}

/**
 * 获取十神关系
 * @param dayWuxing 日干五行
 * @param wuxing 其他五行
 * @returns 十神名称
 */
function getTenGod(dayWuxing: string, wuxing: string): string {
  if (wuxing === dayWuxing) {
    return '比劫';
  }
  
  return TEN_GOD_MAP[dayWuxing]?.[wuxing] || '';
}


/**
 * 计算简单的五行个数统计
 * @param eightChar 八字对象
 * @returns 五行个数统计
 */
/**
 * 初始化五行计数对象
 */
function initWuxingCount() {
  return { '木': 0, '火': 0, '土': 0, '金': 0, '水': 0 };
}

/**
 * 统计五行个数
 */
function countWuxing(items: string[]): { [key: string]: number } {
  const count = initWuxingCount();
  for (const item of items) {
    const wuxing = wxForBz(item);
    if (wuxing) count[wuxing]++;
  }
  return count;
}

/**
 * 转换为数组格式
 */
function toWuxingArray(count: { [key: string]: number }, dayWuxing: string) {
  return WUXING_ORDER.map(wx => ({
    wx,
    value: count[wx],
    ss: getTenGod(dayWuxing, wx)
  }));
}

export function calculateSimpleWuxingCount(eightChar: any) {
  // 获取日干五行（用于计算十神）
  const dayStem = eightChar.getDay().getHeavenStem().getName();
  const dayWuxing = wxForBz(dayStem);
  
  // 构建八字数组 [年干,年支,月干,月支,日干,日支,时干,时支]
  const bzArr = [
    eightChar.getYear().getHeavenStem().getName(),
    eightChar.getYear().getEarthBranch().getName(),
    eightChar.getMonth().getHeavenStem().getName(),
    eightChar.getMonth().getEarthBranch().getName(),
    eightChar.getDay().getHeavenStem().getName(),
    eightChar.getDay().getEarthBranch().getName(),
    eightChar.getHour().getHeavenStem().getName(),
    eightChar.getHour().getEarthBranch().getName()
  ];
  
  // 获取藏干数组
  const cgArr = [
    eightChar.getYear().getEarthBranch().getHideHeavenStems().map((hs: any) => hs.getName()),
    eightChar.getMonth().getEarthBranch().getHideHeavenStems().map((hs: any) => hs.getName()),
    eightChar.getDay().getEarthBranch().getHideHeavenStems().map((hs: any) => hs.getName()),
    eightChar.getHour().getEarthBranch().getHideHeavenStems().map((hs: any) => hs.getName())
  ];
  
  // 计算五行个数（天干+地支）
  const wxCount = countWuxing(bzArr);
  
  // 计算含藏干数（天干+藏干）
  const wxcgCount = initWuxingCount();
  // 统计天干
  for (let i = 0; i < 8; i += 2) {
    const wuxing = wxForBz(bzArr[i]);
    if (wuxing) wxcgCount[wuxing]++;
  }
  // 统计藏干
  for (const stems of cgArr) {
    for (const stem of stems) {
      const wuxing = wxForBz(stem);
      if (wuxing) wxcgCount[wuxing]++;
    }
  }
  
  return {
    wuxingCount: toWuxingArray(wxCount, dayWuxing), // 五行个数（天干+地支）
    hiddenWuxingCount: toWuxingArray(wxcgCount, dayWuxing) // 含藏干数（天干+藏干）
  };
}
